package com.ufcg.lvc.server;

import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import com.google.gwt.user.server.rpc.RemoteServiceServlet;
import com.ufcg.lvc.client.GreetingService;

/**
 * The server side implementation of the RPC service.
 */
@SuppressWarnings("serial")
public class GreetingServiceImpl extends RemoteServiceServlet implements
		GreetingService {

	private Conexao conexaoUsuario = new Conexao().getNewConexao();

	public String validaUsuarioSenha(String usuario, String senha) {
		return conexao(usuario, senha);
	}

	public String cadastraUsuarioSenha(String usuario, String senha) {
		return cadastra(usuario, senha);
	}

	public String conexao(String usuario, String senha) {
		try {
			// Achou o usuario
			if (procuraBD("usuario", "login", usuario, "senha", senha) == true) {
				return "Usuário e senha válidos.";
			}
			// Nao achou o usuario
			else {
				return "Erro: Usuário e senha inválidos.";
			}

		} catch (Exception erro) {
			return "Erro: Não foi possível acessar o banco de dados.\n" + erro;
		}
	}

	public String cadastra(String usuario, String senha) {

		// Verifica se o usuario e a senha estao validos
		if ((usuario.trim().length() >= 3) & (senha.trim().length() >= 3)) {
			try {
				// Verifica se o login esta disponivel
				String sql = "select * from USUARIO where LOGIN like '"
						+ usuario + "';";
				conexaoUsuario.executaConsulta(sql);

				// Se achar o valor
				if (procuraBD("usuario", "login", usuario)) {
					return "Erro: Login não disponível.\nJá existe um usuário com esse login.";
				}

				// Se o login estiver disponivel, o cadastra o usuario
				else {
					String sql2 = "insert into USUARIO values ('" + usuario
							+ "','" + senha + "');";
					conexaoUsuario.executaUpdate(sql2);
					return "Usuário casdastrado!";
				}
			} catch (Exception erro) {
				return "Erro: Não foi possível cadastrar o usuário.\n" + erro;
			}
		}
		// Loing e/ou senha invalidos
		else {
			return "Erro: Login e senha devem possuir pelo menos três caracteres.";
		}
	}

	public boolean procuraBD(String tabela, String coluna, String valor) {
		try {
			// Procura um valor em uma coluna de uma tabela do banco de dados
			String sql = "select * from " + tabela + " where " + coluna
					+ " like '" + valor + "';";
			conexaoUsuario.executaConsulta(sql);

			// Se achar o valor
			if (conexaoUsuario.resultSet.first()) {
				System.out.println("Achou " + valor);
				return true;
			}
		}
		// Se nao achar o valor
		catch (SQLException e) {
			System.out.println("Nao achou " + valor);
			return false;
		}
		System.out.println("Nao achou " + valor);
		return false;
	}

	public boolean procuraBD(String tabela, String coluna, String valor,
			String coluna2, String valor2) {
		try {
			// Procura dois valores em duas colunas de uma tabela do banco de
			// dados
			String sql = "select * from " + tabela + " where " + coluna
					+ " like '" + valor + "' and " + coluna2 + " like '"
					+ valor2 + "';";
			conexaoUsuario.executaConsulta(sql);

			// Se achar o par de valores
			if (conexaoUsuario.resultSet.first()) {
				return true;
			}
		}
		// Se nao achar o par de valores
		catch (SQLException e) {
			return false;
		}
		return false;
	}

	@Override
	public Boolean salvarQuestao(String titulo, String assunto,
			String enunciado, String dificuldade, String tipo, String imagem) {
		try {
			String sql = "insert into QUESTAO values ('" + titulo + "','"
					+ enunciado + "','" + assunto + "','" + tipo + "','"
					+ dificuldade + "');";
			conexaoUsuario.executaUpdate(sql);
			System.out.println("Questão salva " + titulo + "\n" + enunciado
					+ "\n" + assunto + "\n" + tipo + "\n" + dificuldade);
			return true;

		} catch (Exception erro) {
			System.out.println("Erro ao salvar nova questao: " + erro);
			return false;
		}
	}

	@Override
	public List<String> getLista(String tabela, String coluna) {
		List<String> lista = new ArrayList<>();
		try {
			String sql = "select " + coluna + " from " + tabela + ";";
			conexaoUsuario.executaConsulta(sql);
			while (conexaoUsuario.getResultSet().next()) {
				System.out.println(conexaoUsuario.getResultSet().getArray(1)
						.toString());
				lista.add(conexaoUsuario.getResultSet().getArray(1).toString());
			}
		} catch (Exception erro) {
			System.out.println("Erro ao recuperar questao: " + erro);
		}
		System.out.println(lista.toArray().toString());
		return lista;
	}

	@Override
	public List<List<String>> getDados(String tabela, String coluna1,
			String coluna2, String coluna3, String coluna4, String coluna5) {
		
		List<List<String>> listaListas = new ArrayList<>();
		
		List<String> lista1 = new ArrayList<>();
		List<String> lista2 = new ArrayList<>();
		List<String> lista3 = new ArrayList<>();
		List<String> lista4 = new ArrayList<>();
		List<String> lista5 = new ArrayList<>();
		
		try {
//			String sql = "select " + coluna1 + ", " + coluna2 + ", " + coluna3 + ", " + coluna4 + " from "+ tabela + ";";
			String sql = "select * from "+ tabela + ";";
			conexaoUsuario.executaConsulta(sql);
			while (conexaoUsuario.getResultSet().next()) {
				lista1.add(conexaoUsuario.getResultSet().getArray(1).toString());
				lista2.add(conexaoUsuario.getResultSet().getArray(2).toString());
				lista3.add(conexaoUsuario.getResultSet().getArray(3).toString());
				lista4.add(conexaoUsuario.getResultSet().getArray(4).toString());
				lista5.add(conexaoUsuario.getResultSet().getArray(5).toString());
			}
		} catch (Exception erro) {
			System.out.println("Erro ao recuperar questao: " + erro);
		}
		listaListas.add(lista1);
		listaListas.add(lista2);
		listaListas.add(lista3);
		listaListas.add(lista4);
		listaListas.add(lista5);
		return listaListas;
	}
}